package main

import (
	// "Test_go/bitmap"

	"fmt"
	"sync"
	"time"
	// "unsafe"
	// "internal/itoa"
	// "unsafe"
)

// func Add(x, y int, z string) int {
// 	fmt.Println(z)
// 	return x + y
// }
// func get_Number() func() int {
// 	i := 0
// 	i += 1
// 	return func() int {
// 		i += 1
// 		return i
// 	}
// }

// type people struct {
// 	age int
// }
// type student struct {
// 	id   int
// 	name string
// 	people
// }

//	func (st *student) GetName() string {
//		return st.name
//	}
// type people struct {
// 	name string
// }

// func (pp *people) GetName() string {
// 	return pp.name
// }

// type student struct {
// 	id int
// 	people
// }

//	func (st *student) GetId() int {
//		return st.id
//	}
// type Phone interface {
// 	Call()
// 	SendMessage()
// }
// type Apple struct {
// 	name string
// }

//	func (ap *Apple) Call() {
//		fmt.Println("Apple Call.")
//	}
//
//	func (ap *Apple) SendMessage() {
//		fmt.Println("Apple Send Message.")
//	}
//
//	func show_interface(p Phone) {
//		fmt.Println("phone interface: ")
//		p.Call()
//		p.SendMessage()
//	}
//
//	func show_void_interface(p interface{}) {
//		fmt.Println("void interface: ")
//		fmt.Printf("%+v\n", p)
//	}
//
//	func Add(a, b int) (int, error) {
//		if a < 0 || b < 0 {
//			return -1, fmt.Errorf("num is not a positive number")
//		}
//		return a + b, nil
//	}
//
//	func defer1() {
//		fmt.Println("defer 01: ")
//	}
//
//	func defer2() {
//		fmt.Println("defer 02: ")
//	}
//
//	func defer3() {
//		fmt.Println("defer 03: ")
//	}
//
//	func deferRun() int {
//		num := 1
//		defer func() {
//			num++
//			// res++
//		}()
//		return num
//	}
//
//	func pan_te() {
//		fmt.Println("111111111111111111111111")
//		defer func() {
//			if error := recover(); error != nil {
//				fmt.Println("出现panic", error)
//			}
//		}()
//		panic("这是一个panic")
//		fmt.Println("222222222222222")
//	}
// func task_1() {
// 	for i := 1; i <= 100; i++ {
// 		fmt.Println("task 1: ", i)
// 		time.Sleep(time.Millisecond * 3)
// 	}

// }
//
//	func task_2(wg *sync.WaitGroup) {
//		defer wg.Done()
//		for i := 1; i <= 100; i++ {
//			fmt.Println("task 2: ", i)
//			time.Sleep(time.Millisecond * 2)
//		}
//	}
//
//	func task_3(wg *sync.WaitGroup) {
//		defer wg.Done()
//		for i := 1; i <= 100; i++ {
//			fmt.Println("task 3: ", i)
//			time.Sleep(time.Millisecond * 2)
//		}
//	}
//
// type SChannel chan<- int
// type RChannel <-chan int
//
//	func sum(a_array []int, c chan int) {
//		s := 0
//		for _, v := range a_array {
//			s += v
//		}
//		c <- s
//	}
var wg sync.WaitGroup

// var wg2 = sync.WaitGroup{}
// var mu = sync.Mutex{}
// var n int

// type Config struct{}

// var instance *Config
// var once sync.Once

//	func InitConfig() *Config {
//		once.Do(func() {
//			instance = &Config{}
//			fmt.Println("执行once")
//		})
//		return instance
//	}
//
//	func Add(wg *sync.WaitGroup) {
//		defer wg.Done()
//		mu.Lock()
//		n++
//		mu.Unlock()
//	}
// var cnt int

// var m = make(map[string]int)
// var m sync.Map
// var mu sync.Mutex

//	func getVal(key string) int {
//		a, _ := m.Load(key)
//		return a
//	}
//
//	func setVal(key string, val int) {
//		m[key] = val
//	}
// type student struct {
// 	name string
// 	age  int
// }
// var wg sync.WaitGroup
// var ch_array []chan
// func ccc(ctx context.Context){

// }
func Watch() chan struct{} {
	ticker := time.NewTicker(time.Second * 1)
	ch := make(chan struct{})
	fmt.Println("watch ch addr")
	fmt.Println(&ch)
	go func(ticker *time.Ticker) {
		defer ticker.Stop()
		for {
			select {
			case <-ch:
				fmt.Println("ticker end..")
				return
			case <-ticker.C:
				fmt.Println("ticker.")
			}
		}
	}(ticker)
	return ch
}

func main() {
	ch := Watch()
	time.Sleep(time.Second * 10)
	ch <- struct{}{}
	fmt.Println("main ch addr")
	fmt.Println(&ch)
	close(ch)
	fmt.Println("ch end..")
	// ch1 := make(chan int, 1)
	// go func() {
	// 	time.Sleep(time.Second * 3)
	// 	ch1 <- 111
	// }()
	// select {
	// case <-ch1:
	// 	fmt.Println("ch1 get data...")
	// case <-time.After(time.Second * 1):
	// 	fmt.Println("1 s After..")
	// }
	// fmt.Println("end")
	// fmt.Println(time.Now())
	// timer := time.NewTimer(time.Second * 3)
	// fmt.Println(timer.Stop())
	// timer.Reset(time.Second * 3)
	// t := <-timer.C
	// fmt.Println(t)
	// fmt.Println(timer.Stop())
	// fmt.Println("3s after..")
	// fmt.Println(time.Now())

	// after_fun := func() {
	// 	fmt.Println("After func Done...")
	// }
	// timer2 := time.AfterFunc(time.Second*2, after_fun)
	// time.Sleep(time.Second * 4)
	// defer timer2.Stop()
	// ch1 := make(chan int, 2)
	// ch2 := make(chan int, 1)
	// ch1 <- 111
	// ch2 <- 222
	// ch1 <- 112
	// for i := 0; i < 5; i++ {
	// 	select {
	// 	case <-ch1:
	// 		fmt.Println("ch1 out...")
	// 		time.Sleep(time.Second)
	// 	case <-ch2:
	// 		fmt.Println("ch2 out...")
	// 		time.Sleep(time.Second)
	// 	default:
	// 		fmt.Println("default...")
	// 		time.Sleep(time.Second)
	// 	}
	// }
	// time.Sleep(time.Second * 5)
	// fmt.Println("Done.")
	// pool := sync.Pool{
	// 	New: func() any {
	// 		return &student{
	// 			"zhangsan",
	// 			18,
	// 		}
	// 	},
	// }
	// st := pool.Get().(*student)
	// fmt.Println(st)
	// fmt.Printf("%p\n", st)
	// st.name = "lisi"
	// pool.Put(st)
	// st2 := pool.Get().(*student)
	// fmt.Println(st2)
	// fmt.Printf("%p\n", st2)
	// st1 := student{
	// 	"zhangsan",
	// 	18,
	// }
	// st2 := student{
	// 	"lisi",
	// 	19,
	// }
	// var a atomic.Value
	// a.Store(st1)
	// fmt.Println(a.Load().(student))
	// s := a.Swap(st2)
	// fmt.Println(s)
	// fmt.Println(a.Load().(student))
	// a.CompareAndSwap()
	// var sum int32 = 0
	// var abc atomic.Value
	// abc.Load()
	// var wg sync.WaitGroup
	// for i := 0; i < 1000; i++ {
	// 	wg.Add(1)
	// 	go func() {
	// 		defer wg.Done()
	// 		// sum += 1
	// 		atomic.AddInt32(&sum, 1)
	// 		atomic.CompareAndSwapInt32(&sum, 123, 345)
	// 		atomic.LoadInt32(&sum)
	// 		atomic.StoreInt32(&sum, 234)
	// 		atomic.SwapInt32(&sum, 123)

	// 	}()
	// }
	// wg.Wait()
	// fmt.Println(sum)
	// var m sync.Map
	// m.Store("abc", "def")
	// m.Store("val", 12345)
	// val, _ := m.Load("val")
	// fmt.Println(val.(int))
	// m.Range(func(key, value any) bool {
	// 	fmt.Println("key: ", key, "value: ", value)
	// 	return true
	// })
	// m.Store("c", "ccc")
	// d, _ := m.LoadOrStore("c", "ddd")
	// fmt.Println(d)
	// fmt.Println(m.Load("c"))
	// m.LoadAndDelete()
	// wg.Add(10)
	// for i := 0; i < 10; i++ {
	// 	go func(num int) {
	// 		defer wg.Done()
	// 		str_i := strconv.Itoa(num)
	// 		setVal(str_i, num)
	// 		fmt.Println(getVal(str_i))
	// 	}(i)
	// }
	// wg.Wait()
	// cnt = 0
	// var mu1, mu2 sync.Mutex
	// var wg = sync.WaitGroup{}
	// wg.Add(2)
	// go func() {
	// 	defer wg.Done()
	// 	mu1.Lock()
	// 	defer mu1.Unlock()
	// 	time.Sleep(time.Second)
	// 	mu2.Lock()
	// 	defer mu2.Unlock()
	// }()
	// go func() {
	// 	defer wg.Done()
	// 	mu2.Lock()
	// 	defer mu2.Unlock()
	// 	time.Sleep(time.Second)
	// 	mu1.Lock()
	// 	defer mu1.Unlock()
	// 	mu2.Unlock()
	// }()
	// time.Sleep(time.Second * 5)
	// wg.Wait()
	// var mr = sync.RWMutex{}
	// for i := 0; i < 3; i++ {
	// 	go func(mr *sync.RWMutex, i int) {
	// 		fmt.Printf("read goroutine %d start!\n", i)
	// 		mr.RLock()
	// 		fmt.Println("cnt val: ", cnt)
	// 		time.Sleep(time.Second)
	// 		mr.RUnlock()
	// 		fmt.Printf("read goroutine %d end!\n", i)
	// 	}(&mr, i)
	// }
	// for i := 0; i < 3; i++ {
	// 	go func(mr *sync.RWMutex, i int) {

	// 		mr.Lock()
	// 		fmt.Printf("write goroutine %d start\n", i)
	// 		cnt++
	// 		fmt.Printf("cnt val add, val %d\n", cnt)
	// 		time.Sleep(time.Second)
	// 		fmt.Printf("write goroutine %d end\n", i)
	// 		mr.Unlock()

	// 	}(&mr, i)
	// }
	// time.Sleep(time.Second * 5)
	// fmt.Println("end all")
	// fmt.Println(cnt)
	// num := 1000
	// n = 0
	// wg.Add(num)
	// for i := 0; i < num; i++ {
	// 	go Add(&wg)
	// }
	// wg.Wait()
	// fmt.Println(n, num, n == num)
	// wg.Add(10)
	// // ch := make(chan struct{}, 10)
	// for i := 0; i < 10; i++ {
	// 	go func(i int, wg *sync.WaitGroup) {
	// 		defer wg.Done()
	// 		fmt.Println("index i: ", i)
	// 		// ch <- struct{}{}
	// 	}(i, &wg)
	// }
	// for i := 0; i < 10; i++ {
	// 	// <-ch
	// }
	// wg.Wait()
	// fmt.Println("执行结束！")
	// a := InitConfig()
	// fmt.Println(a)
	// b := InitConfig()
	// fmt.Println(b)
	// c := InitConfig()
	// fmt.Println(c)
	// fmt.Println(&instance)
	// test_array := []int{1, 2, 3, 4, 5, 6}
	// ch := make(chan int, 2)
	// go sum(test_array[:len(test_array)/2], ch)
	// go sum(test_array[len(test_array)/2:], ch)
	// x, y := <-ch, <-ch
	// fmt.Println(x, y)
	// ch := make(chan int, 5)
	// // ch <- 5
	// // ch <- 6
	// // close(ch)
	// var wg sync.WaitGroup
	// wg.Add(2)
	// go func(wg *sync.WaitGroup) {
	// 	defer wg.Done()

	// 	for i := 0; i < 5; i++ {
	// 		t := <-ch
	// 		fmt.Println("消费者：", t)
	// 		fmt.Println(t)
	// 	}
	// }(&wg)
	// go func(wg *sync.WaitGroup) {
	// 	defer wg.Done()
	// 	time.Sleep(time.Second * 3)
	// 	for i := 0; i < 5; i++ {
	// 		ch <- (i * i)
	// 		fmt.Println("生产者：", i*i)
	// 		time.Sleep(time.Second * 1)
	// 	}
	// }(&wg)
	// wg.Wait()
	// close(ch)
	// _, ok := <-ch
	// fmt.Println("通道数据读取完毕？", ok)
	// ch2 := make(chan int, 3)
	// ch2 <- 1
	// ch2 <- 2
	// ch2 <- 3
	// // ch2 <- 4
	// close(ch2)
	// var wg2 sync.WaitGroup
	// wg2.Add(1)
	// go func(wg *sync.WaitGroup) {
	// 	defer wg.Done()
	// 	for i := 0; i < 4; i++ {
	// 		t := <-ch2
	// 		fmt.Println("out t val: ", t)
	// 	}
	// }(&wg2)
	// wg2.Wait()
	// close(ch2)

	// var wg sync.WaitGroup
	// wg.Add(2)
	// go task_2(&wg)
	// go task_3(&wg)
	// wg.Wait()
	// fmt.Println("main exit.")
	// go task_1()
	// go task_2()
	// go task_3()
	// time.Sleep(time.Second * 5)
	// fmt.Println("end")
	// pan_te()
	// fmt.Println("3333333333333333333")
	// defer defer1()
	// defer defer2()
	// defer defer3()
	// fmt.Println(deferRun())
	// var a interface{}
	// a = "123"
	// var c int
	// c = a.(int)
	// fmt.Println(c)
	// fmt.Println("panic 后内容")
	// fmt.Println("test 1: ")
	// fmt.Println(Add(3, 4))
	// fmt.Println("test 2: ")
	// fmt.Println(Add(-3, 4))
	// fmt.Println("test 3: ")
	// fmt.Println(Add(3, -4))
	// fmt.Println("test 4: ")
	// fmt.Println(Add(-3, -4))
	// var phone Phone
	// phone = new(Apple)
	// aa, bb := phone.(*Apple)
	// fmt.Println(aa, bb)
	// phone.(*Apple).name = "iPhone"
	// fmt.Println("show")
	// phone.Call()
	// phone.SendMessage()

	// show_interface(phone)
	// show_void_interface(phone)
	// var a interface{}
	// a = 13
	// fmt.Println(a)
	// a = "123"
	// fmt.Println(a)
	// fmt.Println(a.(string))
	// fmt.Println(a.(int))
	// var c string
	// c := a.(string)
	// fmt.Println("ok? ", ok)
	// fmt.Println(c)
	// st := &student{
	// 	id: 123,
	// 	people: people{
	// 		name: "abc",
	// 	},
	// }
	// fmt.Println(st.GetId())
	// fmt.Println(st.GetName())
	// fmt.Println(st.name)
	// bm := bitmap.New_bitmap(1000)
	// bm.Set(1)
	// bm.Set(2)
	// a := make([]int, 0, 50)
	// for i := 0; i < 1000; i++ {
	// 	p := cap(a)
	// 	a = append(a, 1)
	// 	q := cap(a)
	// 	if p != q {
	// 		fmt.Println("扩容: ", len(a), cap(a))
	// 	}

	// }
	// fmt.Println("1: ", bm.Get(1))
	// fmt.Println("3: ", bm.Get(3))
	// st := student{
	// 	id:   123,
	// 	name: "hello",
	// 	people: people{
	// 		age: 18,
	// 	},
	// }
	// fmt.Println("getname: ", st.GetName())
	// fmt.Printf("student--people: %+v\n", st)
	// var a *int
	// fmt.Printf("a未初始化： %+v\n", a)
	// // fmt.Printf("a指向的值: %+v\n", *a)
	// b := 12
	// a = &b
	// fmt.Printf("a初始化后: %+v\n", a)
	// fmt.Printf("a指向的值: %+v\n", *a)

	// c := new(string)
	// fmt.Printf("c的地址%+v\n", c)
	// fmt.Printf("c的内容%+v\n", *c)
	// *c = "abc"
	// fmt.Printf("c的地址%+v\n", c)
	// fmt.Printf("c的内容%+v\n", *c)
	// // d := new(int)
	// a_number := get_Number()
	// fmt.Println(a_number())
	// fmt.Println(a_number())
	// fmt.Println(a_number())

	// b_number := get_Number()
	// fmt.Println(b_number())

	// fmt.Println(Add(1, 2, "this is a func"))
	// Add_func := func(a, b int) int {
	// 	return a + b
	// }
	// c := Add_func(222, 333)
	// fmt.Println(c)
	// a_array := []int{1, 2, 3}
	// fmt.Println("a size: ", len(a_array))
	// for i, v := range a_array {
	// 	fmt.Println("count: ", i)
	// 	a_array = append(a_array, v)
	// }
	// fmt.Println("a size: ", len(a_array))
	// a_array := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	// fmt.Println(a_array)
	// a_slice := make([]int, 0)
	// // append(a_slice, 1)
	// fmt.Println(len(a_slice))
	// a_slice = a_array[1:4]
	// fmt.Println(a_slice)
	// fmt.Println(len(a_slice))
	// b_slice := a_array[0:4]
	// fmt.Println("b_slice", b_slice)
	// a_map := map[string]int{
	// 	"aa": 1,
	// 	"bb": 2,
	// }
	// fmt.Println(a_map)
	// a_map["cc"] = 3
	// fmt.Println("cc:", a_map["cc"])
	// dd, d_res := a_map["dd"]
	// fmt.Println("dd", dd)
	// fmt.Println("dd_res: ", d_res)
	// switch a_map["aa"] {
	// case 1:
	// 	fmt.Println("case 1:")
	// 	// fallthrough
	// case 2:
	// 	fmt.Println("case 2:")
	// case 3:
	// 	fmt.Println("case 3:")
	// }
	// for key := range a_map {
	// 	fmt.Println(key)
	// }
	// for key, val := range a_map {
	// 	fmt.Println("key_val: ", key, val)
	// }
	// for i := 1; i < 10; i++ {
	// 	a_array[i] *= 10
	// }
	// for i, val := range a_array {
	// 	fmt.Println("range val: ", i, val)
	// }
	// count := 1
	// for count < 5 {
	// 	fmt.Println("test case: ", count)
	// 	count++
	// }
	// for {
	// 	fmt.Println("test case: ", count)
	// 	count++
	// 	if count > 10 {
	// 		break
	// 	}
	// }
	// fmt.Println("a_array*10: ", a_array)
	// const (
	// 	a = iota
	// 	b
	// 	c
	// 	d = "123"
	// 	e = 123445555
	// 	f
	// 	g
	// 	h = iota
	// 	i
	// )
	// var (
	// 	aa = 12
	// 	bb int
	// 	cc int
	// )
	// fmt.Println(aa, bb, cc)
	// // bb = aa--
	// // --aa
	// bb = 120
	// bb >>= 1
	// fmt.Println(bb)
	// ptr := &aa
	// fmt.Println(*ptr)
	// fmt.Println(ptr)
	// fmt.Println(unsafe.Sizeof(ptr))
	// type student struct {
	// 	id    int
	// 	name  string
	// 	age   int
	// 	score int
	// }
	// st := student{
	// 	id:   1234,
	// 	name: "abc",
	// }
	// fmt.Println(st)
	// fmt.Printf("student: %+v\n", st)
	// fmt.Println(a)
	// fmt.Println(b)
	// fmt.Println(c)
	// fmt.Println(d)
	// fmt.Println(e)
	// fmt.Println(f)
	// fmt.Println(g)
	// fmt.Println(h)
	// fmt.Println(i)
	// fmt.Println("hello")
	// const a = len("hello")
	// var b = [10]int8{1, 2, 3, 4}
	// const b_len = cap(b)
	// fmt.Println(a)
	// fmt.Println(b_len)
	// fmt.Println(unsafe.Sizeof(b))
}
